import json
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib import rcParams
import cartopy.crs as ccrs  # 用于地图投影
from cartopy.mpl.gridliner import Gridliner
import matplotlib.ticker as ticker


# 设置中文字体（SimHei 黑体）
rcParams['font.sans-serif'] = ['SimHei']  # 黑体
rcParams['axes.unicode_minus'] = False  # 解决负号问题

# 读取第一个站点数据文件（stations_1.txt）
def read_station_data_1(file_path):
    latitudes = []
    longitudes = []
    with open(file_path, 'r', encoding='utf-8') as file:
        # 跳过表头
        lines = file.readlines()[1:]
        for line in lines:
            # 按制表符分割数据
            parts = line.split('\t')
            latitudes.append(float(parts[5]))  # 纬度
            longitudes.append(float(parts[6]))  # 经度
    return latitudes, longitudes

# 读取第二个站点数据文件（stations_2.json）
def read_station_data_2(file_path):
    latitudes = []
    longitudes = []
    with open(file_path, 'r', encoding='utf-8') as file:
        data = json.load(file)  # 解析JSON文件
        records = data["RECORDS"]
        for record in records:
            latitudes.append(float(record["lat"]))  # 纬度
            longitudes.append(float(record["lon"]))  # 经度
    return latitudes, longitudes

# 文件路径
file_1 = 'SURF_CHN_MUL_MIN_202301010000.txt'
file_2 = 'tw.json'

# 读取数据
latitudes_1, longitudes_1 = read_station_data_1(file_1)
latitudes_2, longitudes_2 = read_station_data_2(file_2)

# 加载中国省级边界数据（假设你有GeoJSON文件）
china_map = gpd.read_file("china.geojson")  # 请确保这个GeoJSON文件的路径正确

# 创建图形
fig, ax = plt.subplots(figsize=(10, 8))

# 设置墨卡托投影
ax = plt.axes(projection=ccrs.PlateCarree())

# 绘制中国省级边界
china_map.plot(ax=ax, color='lightgrey', edgecolor='black', linewidth=0.5)


# 绘制第一组站点（红色小点）
ax.scatter(longitudes_1, latitudes_1, color='red', label='站点组1', s=1, transform=ccrs.PlateCarree())

# 绘制第二组站点（蓝色小点）
ax.scatter(longitudes_2, latitudes_2, color='red', label='站点组2', s=1, transform=ccrs.PlateCarree())

# 设置标题和标签
ax.set_title('气象站点分布图', fontsize=16)
ax.set_xlabel('经度', fontsize=12)
ax.set_ylabel('纬度', fontsize=12)

# 添加图例
# ax.legend()

# # 设置坐标轴范围
# ax.set_xlim([108, 123])  # 根据经度范围设置
# ax.set_ylim([18, 29])    # 根据纬度范围设置
# 设置地图显示范围：经度从108到123，纬度从18到28
ax.set_extent([108, 123, 18, 28], crs=ccrs.PlateCarree())  # 这行控制显示范围
# 设置网格线（手动设置间隔）
gridlines = ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', linestyle='--')
# 设置经纬度网格线间隔为 1 度
gridlines.xlocator = ticker.MultipleLocator(2)  # 经度间隔为1度
gridlines.ylocator = ticker.MultipleLocator(2)  # 纬度间隔为1度

# 显示地图
plt.grid(True)
plt.show()
